# -*- coding: utf-8 -*- #

"""
@Author: zhongyuan
@Create time:
@File name: auto_update.py
@Function: 自动更新 1.0
"""
import json
import os
import win32api
import winsound
import requests
import hashlib
import win32con


class AutoUpdate(object):

    def __init__(self, json_request_url, version_num):
        self.json_request_url = json_request_url
        self.version_num = version_num.encode()

    def _start_request(self):
        """
        请求更新数据
        :return:
        """
        # 获取当前路径
        current_path = os.getcwd()

        # 对现版本的唯一版本号进行加密
        md5 = hashlib.md5()
        md5.update(self.version_num)
        version_num = md5.hexdigest()
        print(version_num)
        post_data = {"version": version_num}
        # 发送更新程序的请求
        response = requests.post(self.json_request_url, data=json.dumps(post_data))
        # 判断api返回是不是json
        try:
            json_data = response.json()
            if json_data["result"] == "":
                # 程序没有更新
                print("程序没有更新")
            else:
                # 只更新配置文件
                for file_name, file_data in json_data["result"].items:
                    pres_path = "./config/"
                    # 更新配置文件内容
                    with open(pres_path + file_name, 'w') as file:
                        file.write(file_data)
        except Exception as err:
            print(err)
            # 不是json则执行出错，进行整体程序更新
            with open("e_bank_assistant.zip", 'wb') as file:
                file.write(response.content)

            # 调用bat脚本更新EXE文件
            self._bat_update_check(current_path + "/update_check.bat")

    @staticmethod
    def _edition_md5_comp(file_path):
        """
        对本地文件进行md5加密
        :return:md5
        """
        # 判断文件存在
        if os.path.exists(file_path):
            # 读取本地文件
            with open(file_path, 'r') as file:
                # 对文件内容进行md5加密并返回
                return hashlib.md5(file.read())
        else:
            return ""

    @staticmethod
    def _bat_update_check(file_path):
        """
        调用bat脚本控制器更新程序
        :param file_path:
        :return:
        """
        # 启动bat脚本
        os.system(file_path)

    @staticmethod
    def _file_update_tips():
        """
        提示用户程序需更新
        :return: True or False
        """
        # 弹出程序更新提示框
        retuen_yesno = win32api.MessageBox(0, "程序存在更新包，是否更新？", "网银助手更新提示", win32con.MB_YESNO)
        # 程序更新提示音
        winsound.Beep(600, 1000)
        if retuen_yesno == 6:
            # 用户确认安装
            return True
        else:
            # 用户没有点击确认安装
            return False

    def update(self):
        """
        更新程序
        :return:
        """
        # 开始发送更新请求
        self._start_request()


if __name__ == '__main__':
    auto_update = AutoUpdate(json_request_url="http://127.0.0.1/update", version_num="20190218001")
    auto_update.update()
    # md5 = hashlib.md5()
    # md5.update("20190220001".encode())
    # version_num = md5.hexdigest()
    # post_data = {
    #     "version": version_num
    # }
    # post_data = json.dumps(post_data)
    #
    # print(post_data)
